﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using csvmb.csvadapter.contracts;

namespace csvmb.csvadapter
{
    public class Dateiadapter : IDateiadapter
    {
        private string m_dateiname;

        public void Init(string dateiname) {
            Trace.TraceInformation("Dateiadapter.Init aufgerufen mit {0}", dateiname);

            m_dateiname = dateiname;
        }

        public IEnumerable<long> Datenzeilen_Positionen_lesen() {
            Trace.TraceInformation("Dateiadapter.Zeilen_ab_zweiter_Zeile_lesen aufgerufen ohne Parameter");
            
            long pos = 0;
            string zeile;

            using (var inFile = new StreamReader(m_dateiname)) {
                zeile = inFile.ReadLine(); // Spaltenköpfe
                if (zeile != null) {pos += zeile.Length + Environment.NewLine.Length;}

                do {
                    yield return pos;
                    zeile = inFile.ReadLine();
                    if (zeile != null) {pos += zeile.Length + Environment.NewLine.Length;}
                } while (!inFile.EndOfStream );
            }
        }

        public IEnumerable<string> Datenzeilen_ab_Position_lesen(long position, int zeilenAnzahl) {
            Trace.TraceInformation("Dateiadapter.Zeilen_ab_Position_lesen aufgerufen mit {0} und {1}", position, zeilenAnzahl);

            var zeilen = new List<string>();
            using (var inReader = new StreamReader(m_dateiname)) {
                inReader.BaseStream.Position = position;

                do {
                    zeilen.Add(inReader.ReadLine());
                    if (zeilen.Count >= zeilenAnzahl) {
                        break;
                    }
                } while (!inReader.EndOfStream);
            }

            return zeilen;
        }

        public string erste_Zeile_lesen() {
            Trace.TraceInformation("Dateiadapter.erste_Zeile_lesen aufgerufen ohne Parameter");

            var inFile = new StreamReader(m_dateiname);
            var ersteZeile = inFile.ReadLine();
            inFile.Close();

            return ersteZeile;
        }
    }
}